package chapter09;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Java05_Thread_Pool {
    public static void main(String[] args) throws Exception{
        // TODO Java 线程 - 线程池
        // 线程对象的容器
        // 可以根据需求创建一个或多个线程对象
        /**
         * Java中四种常见的线程池
         * 1.创建固定数量的线程对象
         * 2.根据需求动态创建新的线程
         * 3.单一线程
         * 4.定时调度线程
         */

        // 固定数量的线程对象
        // 1.ExecutorService：线程服务对象
        ExecutorService executorService = Executors.newFixedThreadPool(3);
//        for (int i = 0; i < 5; i++) {
//            executorService.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName());
//                }
//            });
//        }

        /* 线程重复使用，当线程2/1空闲后，剩余的逻辑进入到空闲的线程中
        pool-1-thread-2
        pool-1-thread-3
        pool-1-thread-1
        pool-1-thread-2
        pool-1-thread-1
         */
        System.out.println("-----------------------");

        // 2.动态创建线程（不一定每个线程都会使用，因为线城是可以重复使用）
        ExecutorService executorService1 = Executors.newCachedThreadPool();
//        for (int i = 0; i < 20; i++) {
//            executorService1.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName());
//                }
//            });
//        }
        System.out.println("-----------------------");

        // 3.单一线程（工作需要按顺序执行时使用）
        ExecutorService executorService2 = Executors.newSingleThreadExecutor();
//        for (int i = 0; i < 5; i++) {
//            executorService2.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName());
//                }
//            });
//        }

        /*
        pool-3-thread-1
        pool-3-thread-1
        pool-3-thread-1
        pool-3-thread-1
        pool-3-thread-1
         */
        System.out.println("-----------------------");

        // 4.定时调度线程（可以定义线程调度的时间）
        ExecutorService executorService3 = Executors.newScheduledThreadPool(3);
        for (int i = 0; i < 5; i++) {
            executorService3.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            });
        }
    }
}
